﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Windows;

using Fennec;

public delegate void ChangedEventHandler(object sender, IHM.Evenement e);

namespace IHM
{
    public class IHMPartie
    {
        // J'ai tout mis en public pour faciliter le chargement d'une partie
        public Civilisation[] civilisations { get; set; }
        public Carte carte { get; set; }

        public int num_tour { get; set; }
        public bool partie_finie { get; set; }
        public bool partie_initialisée { get; set; }
        public int vainqueur { get; set; }

        public EPartieActionSurPointage action_preparee { get; set; }
        public int civilisation_courante;
        public Ville ville_selectionnée { get; set; }
        public int unité_selectionnée { get; set; }
        public System.Drawing.Point position_sélectionnée { get; set; }

        public Dictionary<int, Unité> unités_sélectionnées { get; set; }
        
        // Attributs rajoutés
            public ECouleur[] couleurs;
            public string[] noms;

        // Observateur
            public event ChangedEventHandler observable;

        public IHMPartie(ECarteTaille taille_carte, IHMCivilisation[] civ)
            {
            // [TEMPORAIRE]
                carte = new Carte(taille_carte, civ.Length);

            //carte = new Carte(taille_carte, types.Length);

            FabriqueCivilisation fabrique = new FabriqueCivilisation();
            civilisations = new Civilisation[civ.Length];
            couleurs = new ECouleur[civ.Length];
            noms = new string[civ.Length];

            for (int i = 0; i < civ.Length; i++)
            {
                civilisations[i] = fabrique.créerCivilisation(civ[i].civilisation);
                couleurs[i] = civ[i].couleur;
                noms[i] = civ[i].nom;

                // TODO créer les unités initiales des civilisations
                // System.Drawing.Point[] spawn_zone = carte.getSpawnZone(i);
                // civilisations[i].créerDirecteur(spawn_zone[0]);
                // civilisations[i].créerEnseignant(spawn_zone[1]);
            }

            civilisation_courante = 0;
            num_tour = 0;
            partie_finie = false;
            action_preparee = EPartieActionSurPointage.PARTIE_ASP_SELECTION_CASE;
            partie_initialisée = true;
            position_sélectionnée = new System.Drawing.Point(0, 0);
        }

        // Dans le cas d'une partie chargée
        public IHMPartie()
        { }
    
        // Exemple de lancement d'évènement : l'évènement EV_TOUR_SUIVANT
        public void tourSuivant()
        {
            /*civilisation_courante = (civilisation_courante + 1) % civilisations.Length;

            while (!civilisations[civilisation_courante].estVivante())
            {
                MessageBox.Show(civilisations[civilisation_courante].nom.ToString());
                civilisation_courante = (civilisation_courante + 1) % civilisations.Length;
            }*/
            num_tour++;
            civilisation_courante = (civilisation_courante + 1) % civilisations.Length;

            if (observable != null)
            {
                observable(AppDomain.CurrentDomain, new Evenement(Enumerations.EEvenement.EV_TOUR_SUIVANT));
            }
        }

        public Civilisation getCivilisationCourante()
        {
            return civilisations[civilisation_courante];
        }

        public bool estTerminée()
        {
            bool civ1Vivante = false;

            foreach (Civilisation civ in civilisations)
            {
                if (!civ1Vivante && civ.estVivante())
                {
                    civ1Vivante = true;
                }
                else if (civ1Vivante && civ.estVivante())
                {
                    return false;
                }
            }
            return true;
        }
        public Civilisation getVainqueur()
        {
            return civilisations[vainqueur];
        }

        /* Actions */

        public void pointerSurCarte(System.Drawing.Point position)
        {
            position_sélectionnée = position;
        }
        public void annulerActionPréparée()
        {
            action_preparee = EPartieActionSurPointage.PARTIE_ASP_SELECTION_CASE;
        }

        /* Actions - unités */

        public void préparerAttaque()
        {
            action_preparee = EPartieActionSurPointage.PARTIE_ASP_ATTAQUE;
        }
        public void préparerDéplacement()
        {
            action_preparee = EPartieActionSurPointage.PARTIE_ASP_DEPLACEMENT;
        }
        public void sélectionnerUnité(int unité)
        {
            unité_selectionnée = unité;
        }
        public Unité getUnitéSélectionnée()
        {
            return (Unité)unités_sélectionnées[unité_selectionnée];
        }

        /* Actions - villes */

        public void fonderVille()
        {
            if (getUnitéSélectionnée().peutFonderVille())
            {
                getUnitéSélectionnée().tuer();
                getCivilisationCourante().ajouterVille(this.carte, position_sélectionnée);
            }
        }
        public void produireDirecteur()
        {
            if (ville_selectionnée.peutProduireDirecteur())
            {
                getCivilisationCourante().ajouterDirecteur(ville_selectionnée.position);
            }
        }
        public void produireEnseignant()
        {
            if (ville_selectionnée.peutProduireEnseignant())
            {
                getCivilisationCourante().ajouterEnseignant(ville_selectionnée.position);
            }
        }
        public void produireEtudiant()
        {
            if (ville_selectionnée.peutProduireEtudiant())
            {
                getCivilisationCourante().ajouterEtudiant(ville_selectionnée.position);
            }
        }

        public void setPoint(int x, int y)
        {
            System.Drawing.Point p = new System.Drawing.Point(x, y);
            position_sélectionnée = p;
        }

    }
}
